<?php  
/**
 * @copyright   七月
 * @license     Licensed (http://www.apache.org/licenses/LICENSE-2.0).
 * @author      July<july491@163.com>
 * 后台登录
 */  
namespace app\admin\controller;  
use think\Controller;
  
//微信接口基础类，其他微信类都继承这个基础类。可以自动判断用户状态，获取用户信息。  
class Wechat extends Controller  
{  
  
    public $appid = 'wx3ba8dab1509dd5fd';                   //微信APPID，公众平台获取  
    public $appsecret = 'e2cdbe1632ddf07a6002b40b0da15983'; //微信APPSECREC，公众平台获取  
    public $index_url = "http://wechat.brsttech.com/app/./index.php?i=&c=&do=&m=";  //微信回调地址，要跟公众平台的配置域名相同  
    public $code;  
    public $openid;  
    public $scope="snsapi_login";//写死，微信暂时只支持这个值
  

     //检测有无$_SESSION。<span style="font-family: Arial, Helvetica, sans-serif;">如果有，直接忽略。</span>  
     //如果没有$<span style="font-family:Arial, Helvetica, sans-serif;">_SESSION</span>，就依次执行getCode、getOpenId、getUserInfo来获取用户信息。目的是解决CODE只能获取一次，刷新页面openid会丢失的问题。  
     //再判断是否在数据库中，没有则写入数据库。最后将open_id写入session。
    /* <span style="white-space:pre">    </span>*/  
    public function _initialize()  
    {  
            if (!$_SESSION['openid']) {                             //如果$_SESSION中没有openid，说明用户刚刚登陆，就执行getCode、getOpenId、getUserInfo获取他的信息  
                $this->code = $this->getCode();  
                $this->access_token = $this->getOpenId();  
                $userInfo = $this->getUserInfo();  
                if ($userInfo) {  
                    $ins = M('Wechat_user_info');/*<span style="white-space:pre">       </span> */   //其他框架请自行调整方法。  
                    $map['openid'] = $userInfo['openid'];  
                    $result = $ins->where($map)->find();            //根据OPENID查找数据库中是否有这个用户，如果没有就写数据库。继承该类的其他类，用户都写入了数据库中。  
                    if (!$result) {  
                        $ins->add($userInfo);  
                    }  
                    session('openid', $userInfo['openid']);         //写到$_SESSION中。微信缓存很坑爹，调试时请及时清除缓存再试。  
                }  
            }  
  
    }  
  
    /** 
     * @explain 
     * 获取code,用于获取openid和access_token 
     * @remark 
     * code只能使用一次，当获取到之后code失效,再次获取需要重新进入 
     * 不会弹出授权页面，适用于关注公众号后自定义菜单跳转等，如果不关注，那么只能获取openid 
     **/  
    public function getCode()  
    {  
        if (isset($_GET["code"])) {  
            return $_GET["code"];  
        } else {  
            $str = "location: https://open.weixin.qq.com/connect/oauth2/authorize?appid=" . $this->appid . "&redirect_uri=" . $this->index_url . "&response_type=code&scope=snsapi_userinfo&state=1#wechat_redirect";  
            header($str);  
            exit;  
        }  
    }  
  
    /** 
     * @explain 
     * 用于获取用户openid 
     **/  
    public function getOpenId()  
    {  
        $access_token_url = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=" . $this->appid . "&secret=" . $this->appsecret . "&code=" . $this->code . "&grant_type=authorization_code";  
        $access_token_json = $this->https_request($access_token_url);  
        $access_token_array = json_decode($access_token_json, TRUE);  
        return $access_token_array;  
    }  
  
    /** 
     * @explain 
     * 通过code获取用户openid以及用户的微信号信息 
     * @return 
     * @remark 
     * 获取到用户的openid之后可以判断用户是否有数据，可以直接跳过获取access_token,也可以继续获取access_token 
     * access_token每日获取次数是有限制的，access_token有时间限制，可以存储到数据库7200s. 7200s后access_token失效 
     **/  
    public function getUserInfo()  
    {  
  
        $userinfo_url = "https://api.weixin.qq.com/sns/userinfo?access_token=".$this->access_token['access_token'] ."&openid=" . $this->access_token['openid']."&lang=zh_CN";  
        $userinfo_json = $this->https_request($userinfo_url);  
        $userinfo_array = json_decode($userinfo_json, TRUE);  
        return $userinfo_array;  
    }  
  
    public function wechatlogin()
    {
        $redirect_uri=urlencode($this->index_url);//该回调需要url编码
        //准备向微信发请求
        $url = "https://open.weixin.qq.com/connect/qrconnect?appid=" . $this->appid."&redirect_uri=".$this->appsecret
        ."&response_type=code&scope=".$this->scope."&state=STATE#wechat_redirect";
        //请求返回的结果(实际上是个html的字符串)
        $result = file_get_contents($url);
        //替换图片的src才能显示二维码
        $result = str_replace("/connect/qrcode/","https://open.weixin.qq.com/connect/qrcode/",$result);
        return $result; //返回页面
    }
       
    
    /** 
     * @explain 
     * 发送http请求，并返回数据 
     **/  
    public function https_request($url, $data = null)  
    {  
        $curl = curl_init();  
        curl_setopt($curl, CURLOPT_URL, $url);  
        curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);  
        curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, FALSE);  
        if (!empty($data)) {  
            curl_setopt($curl, CURLOPT_POST, 1);  
            curl_setopt($curl, CURLOPT_POSTFIELDS, $data);  
        }  
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);  
        $output = curl_exec($curl);  
        curl_close($curl);  
        return $output;  
    }  
} 
